package Chats 
{
	import Chats.*;
	import com.bit101.components.InputText;
	import com.bit101.components.Label;
	import com.bit101.components.PushButton;
	import com.bit101.components.TextArea;
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.ui.Keyboard;
	import net.user1.reactor.Client;
	import net.user1.reactor.IClient;
	import net.user1.reactor.Reactor;
	import net.user1.reactor.Room;
	import net.user1.reactor.RoomEvent;
	
	/**
	 * ...
	 * @author fernet
	 */
	public class ChatRoom extends Sprite
	{
		private var _main:Main;
		private var _reactor:Reactor;
		private var _room:Room;
		private var _chatno:int;
		private var _name:String;
		
		private var _inputBox:InputText;
		private var _logBox:TextArea;
		private var _memberBox:TextArea;
		
		public function ChatRoom(main:Main, chatno:int, name:String) 
		{
			_main = main;
			_reactor = main.getReactor();
			_chatno = chatno;
			_name = name;
			
			connect();
			build();
			refleshMemberList();
		}
		
		/* チャットへの入室 */
		private function connect():void
		{
			/* 入力された名前を設定 */
			_reactor.self().setAttribute(Const.ATTR_NAME, _name);
			
			var roomid:String = "chatroom_" + _chatno.toString();
			_room = _reactor.getRoomManager().createRoom(roomid, null, null, null);
			_room.addEventListener(RoomEvent.ADD_OCCUPANT, onAddOccupant);
			_room.addMessageListener(Const.MSG_TYPE_CHAT, onReceiveMessage);
			_room.join();
		}
		
		/* チャット画面の描画 */
		private function build():void 
		{
			/* 部屋番号の表示 */
			var label:Label = new Label(this, 0, 0);
			label.text = "部屋" + _chatno;
			
			/* チャットログ欄の表示 */
			_logBox = new TextArea(this, 10, 30);
			_logBox.setSize(340, 400);
			_logBox.editable = false;
			
			/* 入室者欄の表示 */
			_memberBox = new TextArea(this, 355, 30);
			_memberBox.setSize(100, 400);
			_memberBox.editable = false;
			_memberBox.autoHideScrollBar = true;
			
			/* 入力テキストボックスの表示 */
			_inputBox = new InputText(this, 4, 439);
			_inputBox.maxChars = 128;
			_inputBox.setSize(390, 22);
			_inputBox.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			
			/* 発言ボタンを表示 */
			var TalkButton:PushButton;
			TalkButton = new PushButton(this, 400, 439, "発言", pushTalkButton);
			TalkButton.setSize(60,22);
			
			/* 退室ボタンを表示 */
			var OutButton:PushButton;
			OutButton = new PushButton(this, 100, 0, "退室", outFromChat);

		}
		
		private function onAddOccupant(e:RoomEvent):void
		{
			trace("クライアントがルームに入室しました。 クライアントIDは: " + e.getClient().getClientID());
			var name:String = e.getClient().getAttribute(Const.ATTR_NAME);
			
			// @todo 自分が入室した時も全員分表示されてしまうのを何とかする
			_logBox.text += 
				" * " + name + " さんが入室しました。 * " +
				"\u000d";
			
			refleshMemberList();
		}
		
		private function onReceiveMessage(fromClient:IClient, messageText:String):void
		{
			trace("サーバから受信：" + messageText);
			
			var date:Date = new Date();
			
			/* チャット欄に入力テキストボックスの内容を追記する */
			_logBox.text += 
				// 発言時刻
				date.toLocaleTimeString() + " " +
				// 発言者の名前
				fromClient.getAttribute(Const.ATTR_NAME) + ": " +
				// 発言内容
				messageText +
				"\u000d";
			
			// @todo 発言に伴って下へスクロール
		}
		
		private function refleshMemberList():void
		{
			_memberBox.text = "";
			var list:Array = _room.getOccupants();
			trace(list);
			for each(var client:Client in list) {
				_memberBox.text +=
					"(" + client.getClientID() + ") " +
					client.getAttribute(Const.ATTR_NAME) +
					"\u000d";
			}
		}
		
		/* チャットからの退室 */
		private function outFromChat(event:MouseEvent = null):void 
		{
			/* 退室処理 */
			_room.removeEventListener(RoomEvent.ADD_OCCUPANT, onAddOccupant);
			_room.removeMessageListener(Const.MSG_TYPE_CHAT, onReceiveMessage);
			_room.leave();
			_room = null;
			
			/* ロビー画面の描画 */
			_main.DrawRobby();
		}
		
		/* Enter */
		private function keyDownHandler(e:KeyboardEvent):void
		{
			if (e.keyCode == Keyboard.ENTER) {
				sendMessage();
			}
		}
		
		/* 発言ボタンクリック */
		private function pushTalkButton(event:MouseEvent = null):void
		{
			sendMessage();
		}
		
		/* 発言 */
		private function sendMessage():void
		{
			var message:String = _inputBox.text;
			
			/* 未入力時は発言処理を行わない */
			if (message == "") {
				return
			}
			
			/* 発言を送信 */
			_room.sendMessage(Const.MSG_TYPE_CHAT, true, null, message);
			
			/* 入力テキストボックスをクリアする */
			_inputBox.text = ""
		}
		
	}

}